带令牌修饰符的 readncFile2
这个 CNC12_TokenModifier.project
示例项目位于的安装目录中 CODESYS 下面 ..\CODESYS SoftMotion\Examples
。
此示例说明如何在导入期间修改 G 代码,以便将路径速度单位(F 字)从 mm/min 转换为 mm/s。这是通过插入 G 代码来完成的 1/60.0 *
读取 F 字的 G 代码时,在速度值之前。 F6000
然后变成 F 1/60.0 * 6000
,稍后由 SMC_NCInterpreter
功能块到 F100
。在简单的情况下,你可以跳过乘法 1/60
然后只需调整值(例如,从 6000
到 100
)。但是,乘法更为通用,因为它在使用变量时也起作用 F $SPEED$
变成 F 1/60.0 * $SPEED$
。
应用程序的结构
与CNC应用程序一样,该应用程序包括路径处理(CNC_PreparePath
程序)和插值(CNC
程序)。由于插值与其他示例没有区别,因此此处不作进一步讨论
在低优先级中,每隔 20 毫秒循环调用路径处理 PathTask
。在高优先级中,每 4 毫秒循环调用插值 MotionTask
。后台任务 VISU_TASK
是为可视化定义的。
您可以开始处理可视化中的 G 代码。G 代码和机器的移动(3D 龙门架)显示在可视化的右侧
G 代码
CNC_PathSpeed
N10 G01 X1000 F6000 N20 Y1000
在这个 G 代码中,以方块为单位的路径速度 N10
设置为 F6000
到 6000 毫米/分钟。但是,CNC 功能块期望路径速度以 mm/s 为单位。命令进行两次线性运动,首先是 X=1000
然后到 X=1000, Y=1000
。
代币处理
这个 SMC_ReadNCFile2
和 SMC_ReadNCFromStream
功能块提供了在读取 G 代码时执行您自己的转换的能力。这里我们使用的是 SMC_ITokenModifier
接口,通过传递 aTokenModifier
输入。
此接口适用于 “令牌”。这些是 G 代码的基本部分,开始处理时将 G 代码文本细分为
N50 G36 O$plc_variable$ D'TextTest' X-1 (Comment)
此 G 代码细分如下:
文本 | SMC_TOKENTYPE | SMC_TOKENVALUE |
---|---|---|
| identifer | stValue = 'N' |
| number | fValue = 50.0 |
| identifer | stValue = 'G' |
| number | fValue = 36.0 |
| identifer | stValue = 'O' |
| variable | stValue = 'plc_variable' |
| identifer | stValue = 'D' |
| strLiteral | stValue = 'TextTest' |
| identifer | stValue = 'X' |
| operator | stValue = '-' |
| number | fValue = 1.0 |
不需要进一步处理的信息(例如空白字符、换行符和注释)不会出现在标记列表中。
当 SMC_ITokenModifier
接口已实现,可以通过添加新令牌,删除令牌和更改令牌的值来调整令牌列表。
Start
:功能块的初始化。内部状态已重置。Call
: 处理 G 代码时调用此方法。可以从输入队列中读取和删除令牌,然后将其添加到输出队列中。
实施
所有令牌都从输入队列移到输出队列。
如果检测到 F 字,则有两个新标记,
1/60
和*
,在 “F” 的标记之后和速度值的标记之前添加。
这个 Call
方法包含处理令牌的逻辑。首先将令牌从输入队列中移出会很有帮助(tokensIn
) 到临时队列 (m_tmpQueue
),在那里处理它们,然后将它们移到输出队列 (tokensOut
)。临时队列并不是调整路径速度的绝对必要条件,但在更复杂的情况下,它可以简化程序结构。
方法:打电话
起初,系统在 STATE_RUNNING
状态直到处理可以开始(当输入队列中有令牌并且输出队列中仍有空间时)。
IF NOT SMC_NC_CanProcessTokens(tokensIn, tokensOut) THEN // Wait until processing can proceed RETURN; END_IF
然后将令牌从输入队列移到临时队列。
IF m_tmpQueue.IsEmpty() THEN // Move the next token from the in-queue to the tmp-queue. pt := tokensIn.GetFromStart(0); m_tmpQueue.Append(pt^); tokensIn.RemoveFirst(); END_IF
实际处理是在中完成的 ConvertSpeed
方法。
IF NOT m_tmpQueue.IsEmpty() THEN // The actual processing is done here ConvertSpeed(); END_IF
在方法结束时,令牌从临时队列移动到输出队列。
方法:ConvertSpeed
检查临时队列中的第一个令牌。
如果标识符的值为 F
找到了,然后再添加两个代币:数字 1/60.0
和操作员 *
。
(选择临时队列大小的方法是,除了输入队列中的一个令牌之外,队列中还能容纳另外两个令牌)。
tk := m_tmpQueue.GetFromStart(0)^; IF tk.tokenType = SMC_TokenType.identifier THEN tk.GetString(pbyString => pby, iSize => iSize); // 70 = ASCII code for F (path velocity) IF iSize = 1 AND pby^ = 70 THEN // Insert the number 1/60 SMC_Token_InitNumber( tk:= tkNumber, value:= 1/60.0, srcPos:= tk.srcPos); m_tmpQueue.Append(tkNumber); // Insert operator '*' for multiplication SMC_Token_InitOperator( tk:= tkOperator, value:= '*', srcPos:= tk.srcPos); m_tmpQueue.Append(tkOperator); END_IF END_IF
调试
生成应用程序并将其下载到控制器。
启动应用程序,切换到可视化,然后按
Start
。